// #include <iostream>
// // #include <tuple>
// #include "template_test.h"

// // template<typename... Elements>
// // using TypeList = std::tuple<Elements...>;

// class NullType {};

// // template<typename T, typename... U>
// // class TypeList : public TypeList<FrontT<U...>, PopFront<U...>>
// // {

// // };

// template<typename List, typename Element> class ElementIndexT;

// template<typename Element>
// class ElementIndexT<NullType, Element>
// {
//   enum { index = -1 };
// };

// template<typename Element, typename Tail>
// class ElementIndexT<TypeList<Element, Tail>, Element>
// {
//   enum { index = 0 };
// };

// template<typename Element, typename Head, typename Tail>
// class ElementIndexT<TypeList<Head, Tail>, Element>
// {
//   enum { tmp = ElementIndexT<Tail, Element>::index };
//   enum { index = tmp == -1 ? -1 : 1 + tmp };
// };

// using SignedIntegralTypes =
// TypeList<signed char, short, int, long, long long>;

// template<typename List, typename Element>
// using ElementIndex = typename ElementIndexT<List, Element>;

// int main() {
//   size_t index = ElementIndex<SignedIntegralTypes, short>::index;
//   // std::cout << "x: " << x << " typeid(x): " << typeid(x).name() << '\n';
//   return 0;
// }